package com.example.contactos;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.util.ArrayList;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class Agenda_Test {

	private Agenda agenda;
	private Pessoa pessoa1;
	private Pessoa pessoa2;
	private Pessoa pessoa3;

	@Before
	public void setUp() throws Exception {
		agenda = Agenda.getInstance();	
		agenda.clear();
		
		pessoa1 = new Pessoa("teste1", 123);
		agenda.adicionar(pessoa1);
		
		pessoa2 = new Pessoa("teste2", 456);
		agenda.adicionar(pessoa2);		
		
		pessoa3 = new Pessoa("teste3", 789);
	}

	@After
	public void tearDown() throws Exception {
		agenda = null;
		pessoa1 = null;
		pessoa2 = null;
		pessoa3 = null;		
	}

	@Test
	public final void testAdicionar() {
		ArrayList<Pessoa> contactos = agenda.getContactos();
		
		assertTrue(contactos.contains(pessoa1));
		assertTrue(contactos.contains(pessoa2));
		assertFalse(contactos.contains(pessoa3));
	}
	
	@Test
	public final void testGetContactos() {
		ArrayList<Pessoa> contactos = agenda.getContactos();
		
		assertEquals(2, contactos.size());
	}

	@Test
	public final void testPesquisar() {
		ArrayList<Pessoa> pesquisar = agenda.pesquisar("teste");

		assertEquals(2, pesquisar.size());
		
		assertTrue(pesquisar.contains(pessoa1));
		assertTrue(pesquisar.contains(pessoa2));
		assertFalse(pesquisar.contains(pessoa3));
		
		// ---
		
		pesquisar = agenda.pesquisar("teste1");

		assertEquals(1, pesquisar.size());
		
		assertTrue(pesquisar.contains(pessoa1));
		assertFalse(pesquisar.contains(pessoa2));
		assertFalse(pesquisar.contains(pessoa3));
		
		// ---
		
		pesquisar = agenda.pesquisar("testeSemResultados");

		assertEquals(0, pesquisar.size());
		
		assertFalse(pesquisar.contains(pessoa1));
		assertFalse(pesquisar.contains(pessoa2));
		assertFalse(pesquisar.contains(pessoa3));
	}
	
	@Test
	public final void testEditar() {
		ArrayList<Pessoa> contactos = agenda.getContactos();
		
		pessoa1.setBi(321);
		pessoa1.setNome("test4");
		
		Pessoa contactoEditado = null;
		
		for (Pessoa contacto : contactos) {
			if (contacto.getBi() == 321 && contacto.getNome().equals("test4")) {
				contactoEditado = contacto;
				break;
			}
		}
		
		assertNotNull(contactoEditado);	
	}
	
	@Test
	public final void testRemover() {
		boolean removeu = agenda.remover(pessoa1);
		
		assertTrue(removeu);
		
		ArrayList<Pessoa> contactos = agenda.getContactos();
		
		assertFalse(contactos.contains(pessoa1));
		
		// ---		
		
		removeu = agenda.remover(pessoa3);
		
		assertFalse(removeu);
		
		assertEquals(contactos, agenda.getContactos());
		
		
	}



}
